package modelo;

import geometria.Coordenada;

/**
 * 
 * Esta clase representa un vector velocidad, tiene una dirección y un módulo.
 * 
 */
public class Velocidad extends Coordenada {
	/**
	 * 
	 * @param x
	 *            posicion x
	 * @param y
	 *            posicion y
	 */

	public Velocidad(Double x, Double y) {
		super(x, y);
	}

	public Velocidad() {
		super();
	}

	public Velocidad(Coordenada posicion, Coordenada unaCoordenada,
			Double moduloVelocidad) {
		// permite crear velocidades relativas
		super();
		this.p.x = unaCoordenada.getX() - posicion.getX();
		this.p.y = unaCoordenada.getY() - posicion.getY();
		this.setModulo(moduloVelocidad);
	}

	public boolean esNula() {
		return (this.getX() == 0D) && (this.getY() == 0D);
	}

	public void setModulo(double moduloNuevo) throws ModuloInvalidoException {
		double moduloActual = this.getModulo();

		if (moduloNuevo < 0) {
			throw new ModuloInvalidoException();
		}
		if (this.esNula())
			return;
		// Normalizo el vector y lo multiplico por la nueva norma
		this.p.x = moduloNuevo * (this.getX() / moduloActual);
		this.p.y = moduloNuevo * (this.getY() / moduloActual);
	}

	public Double getAngulo() {
		if (this.esNula()) {
			return 0D;
		}

		if ((this.p.getY() == 0) && (this.p.getX() > 0))
			return 0D;
		if ((this.p.getY() == 0) && (this.p.getX() < 0))
			return Math.PI;

		int cuadrante = this.getCuadrante();

		Double auxX;
		Double auxY;

		switch (cuadrante) {

		case (0):
			auxX = this.p.getX();
			auxY = this.p.getY();
			return Math.atan(auxY / auxX);

		case (1):
			auxX = this.p.getY();
			auxY = -this.p.getX();
			return Math.atan(auxY / auxX) + Math.PI / 2;

		case (2):
			return Math.atan(this.p.getY() / this.p.getX()) + Math.PI;

		default:
			return Math.atan(this.p.getY() / this.p.getX());
		}

	}

}
